package org.chen.auth.config;

import cn.dev33.satoken.exception.NotLoginException;
import org.chen.common.exception.BusinessException;
import org.chen.common.result.ResultVO;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.Objects;

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 捕获 NotLoginException 异常
     * @param e NotLoginException
     * @return R
     */
    @ExceptionHandler(NotLoginException.class)
    public ResultVO handleNotLoginException(NotLoginException e) {
        // 可以根据异常信息来定制返回的错误信息
        if(e.getType().equals(NotLoginException.NOT_TOKEN)){
            return ResultVO.fail("未提供Token");
        }else if(e.getType().equals(NotLoginException.INVALID_TOKEN)){
            return ResultVO.fail("未提供有效Token");
        }else if(e.getType().equals(NotLoginException.TOKEN_TIMEOUT)){
            return ResultVO.fail("登录信息已过期，请重新登录");
        }else if(e.getType().equals(NotLoginException.BE_REPLACED)){
            return ResultVO.fail("您的账户已在另一台设备上登录，如非本人操作，请立即修改密码");
        }else if(e.getType().equals(NotLoginException.KICK_OUT)){
            return ResultVO.fail("已被系统强制下线");
        }else{
            return ResultVO.fail();
        }

    }

    // 处理参数校验失败异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResultVO handleValidationException(MethodArgumentNotValidException ex) {
        // 只取第一个错误信息
        String errorMsg = Objects.requireNonNull(ex.getBindingResult().getFieldError()).getDefaultMessage();
        return ResultVO.fail(errorMsg);
    }

    // 处理业务异常
    @ExceptionHandler(BusinessException.class)
    public ResultVO handleBusinessException(BusinessException ex) {
        return ResultVO.fail("业务异常：" + ex.getMessage());
    }

    // 兜底异常处理
    @ExceptionHandler(Exception.class)
    public ResultVO handleException(Exception ex) {
        return ResultVO.fail("系统错误：" + ex.getMessage());
    }
}
